package com.alongthink.javademo.utilTools;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @Auther: along
 * @Date: 2019/4/8 14:15
 * @Description: 导出到Excel
 */
@Slf4j
public class ExportExcel {
    /**
     * 2003 excel后缀
     */
    private static final String EXCEL_XLS = "xls";

    /**
     * 2007 及以上版本excel后缀
     */
    private static final String EXCEL_XLSX = "xlsx";

    /**
     * 功能描述:
     * <创建Excel>
     *
     * @param filePath 导出的文件路径+名称
     * @param list 需要写入到excel中的数据
     * @return void
     */
    public static void export(String filePath, List<String> list,ExcelStyle excelStyle) {
        FileOutputStream out = null;
        try {
            // 创建工作薄
            Workbook wb = null;
            String ext = ".xls";
            if (StringUtils.substringAfterLast(filePath, ".").equals(EXCEL_XLS)) {
                wb = new HSSFWorkbook();
                ext = ".xls";
            }
            if (StringUtils.substringAfterLast(filePath, ".").equals(EXCEL_XLSX)) {
                wb = new XSSFWorkbook();
                ext = ".xlsx";
            }
            if (wb == null) {
                log.error("文件后缀不规范，无法操作excel文件，后缀示例：" + EXCEL_XLS + ", " + EXCEL_XLSX);
                return;
            }
            File file = new File(filePath);
            if(!file.exists()){
                file.mkdir();
            }
//            Date date = new Date();
//            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            out = new FileOutputStream(filePath);
            //计算总共有多少sheet工作簿
            int pages = list.size()%65000==0?(list.size()/65000):(list.size()/65000)+1;
            for(int i=0;i<pages;i++){
//                if(i>0&&i%5==0){
//                    wb.write(out);
//                    out.close();
//                    out = new FileOutputStream(filePath+"/"+simpleDateFormat.format(date)+"表格数据"+(i/5+1)+ext);
//                    //每5个sheet创建一个新文件
//                    // 创建工作薄
//                    wb = new HSSFWorkbook();
//                    if (StringUtils.substringAfterLast(filePath, ".").equals(EXCEL_XLS)) {
//                        wb = new HSSFWorkbook();
//                    }
//                    if (StringUtils.substringAfterLast(filePath, ".").equals(EXCEL_XLSX)) {
//                        wb = new XSSFWorkbook();
//                    }
//                }
                // 创建工作表
                Sheet sheet = wb.createSheet();
                // 设置工作表名
                if(pages>1) {
                    wb.setSheetName(i, excelStyle.getSheetName() + "-" + (i+1));
                }else {
                    wb.setSheetName(i, excelStyle.getSheetName());
                }
                //设置表头样式style
                CellStyle titleStyle = wb.createCellStyle();
                titleStyle.setAlignment(HorizontalAlignment.CENTER);
//                Font font = wb.createFont();
//                font.setFontName("黑体");
//                font.setFontHeightInPoints((short) 12);//设置字体大小
//                font.setBold(true);//粗体显示
                titleStyle.setFont(excelStyle.getFont());

                //设置数据单元格样式
                CellStyle dataStyle = wb.createCellStyle();
//                Font font2 = wb.createFont();
//                font2.setFontName("黑体");
//                font2.setFontHeightInPoints((short) 12);
                dataStyle.setFont(excelStyle.getFont());
                dataStyle.setAlignment(HorizontalAlignment.CENTER);
                //创建第一行标题行
                Row row = sheet.createRow((int) 0);

                //创建第一行第一列
                for(short q = 0; q < excelStyle.getTitle().size(); q++) {
                    Cell cell = row.createCell(q);
                    cell.setCellValue(excelStyle.getTitle().get(q));
                    cell.setCellStyle(titleStyle);
                }
                //循环数据,需根据具体数据具体操作
                for(int j=i*65000;j<list.size()&&j<(i+1)*65000;j++){
                    int rowNum = j%65000+1;//64999 65000
                    Row rowData = sheet.createRow(rowNum);
                    Cell cellData = rowData.createCell((short) 0);
                    String v = list.get(j);
                    cellData.setCellValue(v);
                    cellData.setCellStyle(dataStyle);
                }
            }

            wb.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.flush();
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
